home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / mac2gem.exe / ARGPARSE.H < prev    next >
Text File  |  1987-09-11  |  6KB  |  219 lines

  1. /* argparse.h: @(#) macros for parsing command arguments. */
  2. /* by Alexander B. Abacus */
  3. /* Computer Language BBS file name ARGPARSE.H */
  4. /* This and related files make a more portable version of ARGPAR.H */
  5. /* related files: argparse.use, argbegin.h, argloop.h, argend.h */
  6.  
  7. #ifdef Hargsmall
  8.    /* #endfile            -- this file already included */
  9. #else                /* first inclusion */
  10.  
  11. #define Hargsmall
  12.                 /* and really include this file */
  13. /*[ A.1 ] Required include. */
  14.  
  15. #ifndef FILE
  16. #include <stdio.h>
  17. #endif
  18.  
  19. /*[ A.2 ] Output tutorial information. */
  20.  
  21. /* void */ ArgTutor(line)
  22. char ** line;
  23. {
  24.   for ( (line); ((*line) != (char *) 0); (++line) )
  25.   {
  26.     fprintf
  27.     ( stderr
  28.     , " %s"
  29.     , *line
  30.     );
  31.   }
  32.   exit(1);
  33. }
  34.  
  35. /*[ A.3 ] Dummy function for processing positional arguments. */
  36.  
  37. static
  38. char * argPos( a_keyChar, a_argString )
  39. char   a_keyChar;
  40. char * a_argString;
  41. {
  42. #ifdef DriverH
  43.   fprintf ( stderr, "Argument" );
  44.   if ( a_keyChar != '\0' )
  45.   {
  46.     fprintf ( stderr, " key-letter \'%c\'", a_keyChar );
  47.   }
  48.   if ( a_argString != (char *) 0 )
  49.   {
  50.     fprintf ( stderr, " text \"%s\"", a_argString );
  51.   }
  52.   fprintf ( stderr, ".\n" );
  53. #endif
  54.   return ( (char *) 0 );
  55. }
  56.  
  57. /*[ B.1 ] Standard heading for main(). */
  58.  
  59. #define MAIN() main(argc, argv) int argc; char *argv[];
  60.  
  61. /*[ B.2 ] Optional macros to override defaults. */
  62.  
  63. #define ArgMin(A_Min)           a0.minPositionals = (A_Min);
  64. #define ArgMax(A_Max)           a0.maxPositionals = (A_Max);
  65. #define ArgPosCall(A_Function) a0.ptrFunction = (A_Function);
  66. #define ArgKeyLeading           a0.keysLeading = 1;
  67. #define ArgTrigger(A_Trigger)  a0.keyTrigger = (A_Trigger);
  68. #define ArgDescription(A_Text) a0.tutorial = (A_Text);
  69.  
  70. /*[ C.1 ] Key-letter flag argument, deferred processing. */
  71.  
  72. #define ArgFlagSet(A_KeyLetter, A_FlagCounter) case A_KeyLetter: ++A_FlagCounter; break;
  73.  
  74. /*[ C.2 ] Key-letter flag argument, immediate processing. */
  75.  
  76. #define ArgFlagCall(A_KeyLetter, A_FlagFunction) case A_KeyLetter: if (A_FlagFunction ( *a0.keyPointer, (char *) 0 ) != (char *) 0 ) { ArgTutor( a0.tutorial ); } break;
  77.  
  78.  
  79. /*[ C.3 ] Key-letter text argument, deferred processing. */
  80.  
  81. #define ArgTextSet(A_KeyLetter, A_TextPointer) case A_KeyLetter: argText ( & A_TextPointer, & a0.keyPointer, & a0.argIndex,a0.charIndex, a0.keyTrigger, a0.argc, a0.argVector,a0.tutorial, A_KeyLetter, 0); break;
  82.  
  83. /*[ C.4 ] Key-letter text argument, immediate processing. */
  84.  
  85. #define ArgTextCall(A_KeyLetter, A_TextFunction) case A_KeyLetter: argText ( & a0.textPointer, & a0.keyPointer, & a0.argIndex, a0.charIndex, a0.keyTrigger, a0.argc, a0.argVector, a0.tutorial, A_KeyLetter, A_TextFunction); break;
  86.  
  87. /*[ D.2 ] Function common for key-letter text arguments. */
  88.  
  89. static /* void */ argText
  90. ( a_textPointer
  91. , a_keyPointer
  92. , a_argIndex
  93. , a_charIndex
  94. , a_keyTrigger
  95. , a_argc
  96. , a_argv
  97. , a_tutorial
  98. , a_keyLetter
  99. , a_textFunction
  100. )
  101. char ** a_textPointer;
  102. char ** a_keyPointer;
  103. int *    a_argIndex;
  104. int    a_charIndex;
  105. char    a_keyTrigger;
  106. int    a_argc;
  107. char *    a_argv[];
  108. char *    a_tutorial[];
  109. char    a_keyLetter;
  110. char *    (*a_textFunction) ();
  111. { /* argText() */
  112.   if ( a_textFunction == 0 )
  113.   { /* ArgTextSet */
  114.     if ( (* a_textPointer) != (char *) 0 )
  115.     { /* second occurance of this key letter */
  116.       fprintf
  117.       ( stderr
  118.       , " Stop. Repeated key-letter '%c' with text.\n"
  119.       , a_keyLetter
  120.       );
  121.       ArgTutor( a_tutorial );
  122.     } /* second occurance of this key letter */
  123.   } /* ArgTextSet */
  124.  
  125.   if ( a_charIndex != 1 )
  126.   {
  127.     fprintf
  128.     ( stderr
  129.     , " Stop. Key letter with text must stand alone: \"%s\".\n"
  130.     , a_argv[*a_argIndex]
  131.     );
  132.     ArgTutor( & a_tutorial[0] );
  133.   }
  134.   else if ( ( (*a_keyPointer)[1]) != '\0' )
  135.   { /* text following key letter without a separating white space */
  136.     (*a_textPointer) = (char *) & (*a_keyPointer)[1];
  137.   }
  138.   else /* text must be in the following argument */
  139.   {
  140.     ++(*a_argIndex);
  141.     if ( ((*a_argIndex) >= a_argc)
  142.     ||     (a_keyTrigger == *a_argv[*a_argIndex]) )
  143.     { /* text is missing */
  144.       fprintf
  145.       ( stderr
  146.       , " Stop. Text not found after key letter \"%s\".\n"
  147.       , *a_keyPointer
  148.       );
  149.       --(*a_argIndex);
  150.       ArgTutor( & a_tutorial[0] );
  151.     }
  152.     else
  153.     {
  154.       (*a_textPointer) = (char *) a_argv[*a_argIndex];
  155.     } /* endif */
  156.   } /* endif */
  157.  
  158.   if ( a_textFunction != 0 )
  159.   { /* ArgTextCall */
  160.     if((*a_textFunction) ( a_keyLetter, (* a_textPointer) ) != (char *) 0 )
  161.     {
  162.       ArgTutor( a_tutorial );
  163.     }
  164.   } /* ArgTextCall */
  165.  
  166.   (*a_keyPointer) = (char *) 0;       /* to skip to next element of argv */
  167.  
  168.   return;
  169. } /* argText() */
  170.  
  171. /* --------------------------------------------------------------- */
  172.  
  173. #ifdef DriverH
  174.  
  175. /* T.1: Test driver for this include. */
  176.  
  177. static char * tutorial[] =
  178. {
  179. "Expected arguments are: file1 file2 \n",
  180. "   file1 is the source, \n",
  181. "   file2 is the target. \n",
  182. 0
  183. };
  184.  
  185. main(argCount, argVector)
  186. int    argCount;
  187. char * argVector[];
  188. {
  189.   int     f_flag = 0;
  190.   char    *t_text = (char *) 0;
  191.  
  192. #define ArgCount  argCount
  193. #define ArgVector argVector
  194. #include <argbegin.h>
  195.   ArgMin    (1)
  196.   ArgMax    (2)
  197.   ArgDescription(tutorial)
  198. #include <argloop.h>
  199.   ArgFlagSet  ('f', f_flag)
  200.   ArgFlagCall ('F', argPos)
  201.   ArgTextSet  ('t', t_text)
  202.   ArgTextCall ('T', argPos)
  203. #include <argend.h>
  204.  
  205.   fprintf ( stderr, "Flag counter: %d.\n", f_flag );
  206.   if ( t_text != (char *) 0 )
  207.   {
  208.     fprintf ( stderr, "Text: \"%s\".\n", t_text );
  209.   }
  210.  
  211.   exit (0);
  212. } /* main */
  213.  
  214. #endif
  215.  
  216. #endif
  217.  
  218. /* argparse.h: End of file. */
  219.